﻿/*
 * ========================================================================
 * Copyright(c) 2008-2010北京高阳金信信息技术有限公司, All Rights Reserved.
 * ========================================================================
 *  文件日志信息操作类
 * 
 * 作者：邓太华     时间：2009-11-03
 * 版本：V1.0
 * 
 * 修改者：         时间：                
 * 修改说明：
 * ========================================================================
*/


using System;
using System.Collections.Generic;

using System.Text;
using System.IO;

namespace Hisuntech.SystemFramework.Log
{
    /// <summary>
    /// 文件日志客户端
    /// </summary>
    public class FileLogClient :LogClient 
    {
        private string _logFileName;
        private string _formatFile;
        private string _formatString;

        /// <summary>
        /// 默认构造函数
        /// </summary>
        public FileLogClient()
        {
            
        }

        /// <summary>
        /// 日志文件名，如果不设置，默认在系统运行目录下创建 debug目录，每天写一个日志文件。
        /// </summary>
        public string LogFileName
        {
            get
            {
                if (string.IsNullOrEmpty(_logFileName))
                {
                    _logFileName = base.LogProviderPropertyValue("LogFile");
                    if (_logFileName == "")
                    {
                        string localFolder = AppDomain.CurrentDomain.BaseDirectory + "\\debug";
                        if (!Directory.Exists(localFolder))
                        {
                            Directory.CreateDirectory(localFolder);
                        }
                        _logFileName = localFolder + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                    }
                }
                return _logFileName;
            }
            set { _logFileName = value; }
        }

        /// <summary>
        /// 获取/设置格式文件，文件格式必须为UTF8，可以通过配置指定，文件名：LogFormatFile
        /// </summary>
        /// <remarks>
        /// 格式文件的内容必须带有下面的内容替换标记，例如默认的格式：
        /// [%DateTime%,%Source%,%Level%]
        /// %Message%
        /// </remarks>
        public string FormatFile
        {
            get {
                return _formatFile;
            }
            set
            {
                _formatFile = value;
            }
        }

        /// <summary>
        /// 获取或者设置格式字符串，如果未设置，将试图从格式文件获取，如果没有格式文件，将采用默认格式。
        /// </summary>
        public string FormatString
        {
            get {
                if (string.IsNullOrEmpty(_formatString))
                {
                    if (string.IsNullOrEmpty(this.FormatFile))
                    {
                        this.FormatFile = base.LogProviderPropertyValue("LogFormatFile");
                    }
                    if (!string.IsNullOrEmpty(this.FormatFile))
                    {
                        if (System.IO.File.Exists(this.FormatFile))
                            _formatString = System.IO.File.ReadAllText(this.FormatFile);
                    }
                    else
                    {
                        _formatString = @"
[%DateTime%,%Source%,%Level%]
%Message%
";
                    }
                }
                return _formatString; 
            }
            set { _formatString = value; }
        }

        /// <summary>
        /// 写入日志信息
        /// </summary>
        /// <param name="logInfo"></param>
        /// <returns></returns>
        public override bool WriteLog(LogInfo logInfo)
        {
            return WriteLog(this.LogFileName, logInfo);
        }

        /// <summary>
        /// 指定的日志文件名，如果为空，使用设定的LogFileName 属性
        /// </summary>
        /// <param name="logFile">指定的日志文件名，如果为空，使用设定的LogFileName 属性</param>
        /// <param name="logInfo">日志信息类</param>
        /// <returns>是否成功</returns>
        public bool WriteLog(string logFile, LogInfo logInfo)
        {
            try
            {
                if (string.IsNullOrEmpty(logFile))
                    logFile = this.LogFileName;
                File.AppendAllText(logFile, getWMsg( logInfo.LogTime.ToString() ,logInfo.Source , logInfo.Level.ToString() , logInfo.Message));
                LogWorkMessage = "写日志文件 "+logFile+" 操作成功！";
                return true;
            }
            catch (Exception ex)
            {
                ErrMessage = ex.Message;
                return false;
            }
        }

        private  string getWMsg(string logTime,string source,string level,string msg)
        {
            return this.FormatString.Replace("%DateTime%", logTime).Replace("%Source%", source).Replace("%Level%", level).Replace("%Message%", msg);
        }

    }
}
